//实现了基于信号的回收子进程代码
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>

pid_t id;
void handler(int signo)
{
    sleep(5);//当接收到ctrl+c的二号信号时，子进程退出
    //在sleep的5秒钟内处于僵尸状态
    printf("捕捉到一个信号：%d,who:%d\n",signo,getpid());
    

    while(1)//增加死循环，目的使所有的子进程都被回收
    {
        //pid_t res=waitpid(-1,NULL,0);//阻塞式回收
        pid_t res=waitpid(-1,NULL,WNOHANG);//非阻塞式回收
        if(res>0)
        {
        printf("wait success,res:%d,id:%d\n",res,id);
        }
        else break;
    }

}
int main()
{
    signal(SIGCHLD,handler);
    pid_t id=fork();
    if(id==0)
    {
        int cnt=5;
        while(cnt)
        {
            printf("我是子进程，我的pid：%d，ppid：%d\n",getpid(),getppid());
            sleep(1);
            cnt--;
        }
        exit(1);
    }

    while(1)
    {
        sleep(1);
    }
    return 0;
}